package abstractClass;

/**
 * 抽象类 - 定义算法骨架
 */
public abstract class AbstractClass {
    
    /**
     * 模板方法 - 定义算法骨架（final防止子类重写）
     */
    public final void templateMethod() {
        // 步骤1
        primitiveOperation1();
        
        // 步骤2
        primitiveOperation2();
        
        // 步骤3 - 钩子方法
        if (hook()) {
            primitiveOperation3();
        }
        
        // 步骤4
        primitiveOperation4();
    }
    
    /**
     * 基本方法1 - 抽象方法，由子类实现
     */
    protected abstract void primitiveOperation1();
    
    /**
     * 基本方法2 - 抽象方法，由子类实现
     */
    protected abstract void primitiveOperation2();
    
    /**
     * 基本方法3 - 具体方法，提供默认实现
     */
    protected void primitiveOperation3() {
        System.out.println("抽象类中的默认实现");
    }
    
    /**
     * 基本方法4 - 具体方法，提供默认实现
     */
    protected void primitiveOperation4() {
        System.out.println("抽象类中的默认实现");
    }
    
    /**
     * 钩子方法 - 子类可以选择性重写
     */
    protected boolean hook() {
        return true;
    }
}